Fork me on GitHub

Dokcer环境下 Redis 主从搭建

为什么要搭建 Redis 集群?

虽然Redis单机性能已经很高了,但是 实际上Redis是可以像MySQL那样支持主从结构的,也就是常见的读写分离,主机master负责键的新增和修改,从机slave负责读。

不仅如此,在保证高可用方面,官方推出了Sentinel(哨兵)作为高可用的解决方案,在集群中的节点出现故障时能够及时进行故障转移,踢掉不可用的节点。

这篇文章记录下在本地使用docker来搭建 Redis 主从的过程,把遇到的问题都记录下来,注意,这里只是简单的搭建主从集群,模式为一主多从,并不保证高可用。

系统:Mac
redis 版本:4.0
docker 版本:17.09.0-ce-mac35 (19611)

获取 Redis 镜像

这里我们先获取镜像,获取镜像可以从Docker hub获取,觉得慢的话或者使用国内的镜像。

1
docker pull redis

拉取到的镜像为

配置 Redis 集群

我们打算搭建的是一个一主二从的结构,首先需要获取配置文件redis.conf,你可能有疑问,下载的镜像不是开箱即用的吗?为什么还需要单独下载配置文件?主要是因为我们想更方便的去管理这个配置文件,修改和管理会更加方便。而且由于是放在外面,不会有丢失的危险。

这里我们从官网下载一份标准的配置

1
http://download.redis.io/redis-stable/redis.conf

下载完成后,复制为三份,分别命名为redis-master1.conf,redis-slave1.conf,redis-slave2.conf,分别是主机的配置和两个从机的配置。文件的放置目录没有特殊要求,放在一个单独的文件夹即可。

redis-master.conf做如下修改:

1
bind 0.0.0.0  #原来是 bind 127.0.0.0.1

redis-slave1.conf做如下修改:

1
2
bind 0.0.0.0  #原来是 bind 127.0.0.0.1
slaveof redis-master1 6379

redis-slave2.conf做如下修改:

1
2
bind 0.0.0.0  #原来是 bind 127.0.0.0.1
slaveof redis-master1 6379

slaveof :作为另一台机器的从机,这里表示 salve1salve2作为 master1的从机。这里可以直接写redis-master1是因为是服务的名字,后面会说。

启动主从容器

配置完成后,接着我们就需要启动三个容器了,我们这里借助docker compose容器编排来进行管理,避免执行docker run后面跟一大串参数。
我的目录结构如下:

三个配置文件是在conf目录下的。

在当前目录下,创建docker-compose.yml文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3'
services:
redis-master1:
image: redis
container_name: redis-master1
volumes:
- "/Users/jarviszhao/docker/redis/conf/:/usr/local/etc/redis/"
ports:
- "6382:6379"
command: redis-server /usr/local/etc/redis/redis-master1.conf

redis-slave1:
image: redis
container_name: redis-slave1
volumes:
- "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"
ports:
- "6380:6379"
command: redis-server /usr/local/etc/redis/redis-slave1.conf
links:
- redis-master1

redis-slave2:
image: redis
container_name: redis-slave2
volumes:
- "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"
ports:
- "6381:6379"
command: redis-server /usr/local/etc/redis/redis-slave2.conf
links:
- redis-master1

  1. 上面包含三个服务(services)redis-master1redis-slave2redis-slave1
  2. links,将两个容器进行连接,这个连接信息其实是一个hosts映射。如果你打开两个通过–link参数连接的容器中的某个容器的/etc/hosts文件,你将看到如下内容:
    1
    2
    3
    4
    ...
    # 以下记录了容器的连接信息
    172.17.0.2 master 385f6821c0db redis-master
    172.17.0.3 54466fb83744

3.ports指定了端口映射,容器和主机的端口进行映射,方便我们查看数据。
4.volumes把对应的配置文件分别拷贝到容器中。
5.command:容器启动的时候执行的命令,加载拷贝到容器的配置文件进行启动。

最后,执行启动命令:

1
docker-compose up

打印信息如下:

三个容器分别启动了。

此时使用redis-cli info replication命令查看复制信息。

可以看到,角色是master,有两个从机。

查看从机的信息:

表示这是一台从机。

此时在主机执行一个测试命令set name jarvis,可以看到从机也出现了这个数据。

完美!

参考文章

  1. Docker:创建Redis集群
  2. docker compse 命令
  3. docker-compose.yml 语法说明